package demo1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Demo {
    public static void main(String[] args) throws Exception{
        //需求:调用User对象的sayHello()方法

        /*
            1:传统方式-实例化对象，并调用方法
            优点:直观，效率高
            缺点:代码写死了，不利于后期更新维护
                后面出现了新的类或新的方法时，如果想调用则需要修改这里的代码
         */
        User user = new User();
        user.sayHello();


        /*
            2:反射
            缺点:要编写大量的反射代码
            优点:灵活，后期添加了新的类或新的方法，这里无需进行修改
         */
        Class cls = Class.forName("demo1.User");
        User user1 = (User)cls.newInstance();
        user1.sayHello();


        /*
            3:Spring容器
            优点:Spring管理项目中所有的类，可以基于IOC，AOP等特性进行灵活的开发

            创建Spring容器时，需要传入一个参数，该参数是包名
            Spring容器在床架时会扫描这个包，将该包及其子孙包中的所有类扫描一遍，并将
            具有@Component注解的类纳入到容器中进行管理
         */
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext("demo1");
        //可以通过Spring容器获取一个类
        User user2 = context.getBean(User.class);
        user2.sayHello();

    }
}
